﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>
#include<vector>
#include<list>
#include"string.h"
#include"list.h"
using namespace std;
//class Date
//{
//public:
//	Date(int year, int month, int day)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "构造函数" << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(2022, 1, 1); // old style
//	// C++11支持的列表初始化，这里会调用构造函数初始化
//	Date d2{ 2022, 1, 2 };
//	Date d3 = { 2022, 1, 3 };
//	return 0;
//}

//int main()
//{
//	 the type of il is an initializer_list 
//	auto il = { 10, 20, 30 };
//	cout << typeid(il).name() << endl;
//	auto it = il.begin();
//	while (it != il.end())
//	{
//		cout << *it << " ";
//		it++;
//	}
//	return 0;
//}

//int main()
//{
//	int i = 10;
//	auto p = &i; 
//	auto pf = strcpy;
//	auto& x = i;
//	x++;
//	cout << i << endl;
//
//	cout << typeid(p).name() << endl;
//	cout << typeid(pf).name() << endl;
//
//	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
//	//map<string, string>::iterator it = dict.begin();
//	auto it = dict.begin();
//
//	return 0;
//}

//int main()
//{
//	list<int>::iterator it1;
//
//	// typeid推出时一个单纯的字符串
//	cout << typeid(it1).name() << endl;
//	// 不能用来定义对象
//	//typeid(it1).name() it2;
//
//	// 可以用来定义对象
//	decltype(it1) it2;
//	cout << typeid(it2).name() << endl;
//
//	auto it3 = it1;
//	cout << typeid(it3).name() << endl;
//
//	return 0;
//}

//int main() 
//{
//	// 以下的p、b、c、*p都是左值
//	int* p = new int(0);
//	int b = 1;
//	const int c = 2;
//
//	// 以下几个是对上面左值的左值引用
//	int*& rp = p;
//	int& rb = b;
//	const int& rc = c;
//	int& pvalue = *p;
//
//	return 0;
//}

//int main() {
//	double x = 1.1, y = 2.2;
//	// 以下几个都是常见的右值
//	10;
//	x + y;
//	fmin(x, y);
//	// 以下几个都是对右值的右值引用
//	int&& rr1 = 10;
//	double&& rr2 = x + y;
//	double&& rr3 = fmin(x, y);
//	// 这里编译会报错：error C2106: “=”: 左操作数必须为左值
//	//10 = 1;
//	//x + y = 1;
//	//fmin(x, y) = 1;
//
//	return 0;
//}

//int main()
//{
//	// 左值引用只能引用左值，不能引用右值。    
//	int a = 10;
//	int& ra1 = a; // ra为a的别名    
//	//int& ra2 = 10;   // 编译失败，因为10是右值
//	const int& ra3 = 10; //const左值引用可以引用右值
//}

//int main()
//{
//	// 右值引用只能右值，不能引用左值。    
//	int&& r1 = 10;
//	// error C2440: “初始化”: 无法从“int”转换为“int &&”    
//	// message : 无法将左值绑定到右值引用    
//	int a = 10;    
//	int&& r2 = a;
//	// 右值引用可以引用move以后的左值
//	int&& r3 = std::move(a); 
//	return 0;
//}

//int main()
//{
//	zyq::string str;
//	str=zyq::to_string(12345);
//	return 0;
//}


//void push_back(value_type&& val); //右值版本
//void push_back(const value_type& val);//左值版本
//
//int main()
//{
//	list<string> lt;
//	string s1("1111");
//	// s1为左值，这里调用的是拷贝构造
//	lt.push_back(s1);
//
//	// 下面调用都是移动构造
//	lt.push_back("2222");
//	lt.push_back(std::move(s1));
//	return 0;
//}
//运行结果：
//// string(const string& s) -- 深拷贝
//// string(string&& s) -- 移动语义
//// string(string&& s) -- 移动语义

//void Fun(int& x) { cout << "左值引用" << endl; }
//void Fun(const int& x) { cout << "const 左值引用" << endl; }
//void Fun(int&& x) { cout << "右值引用" << endl; }
//void Fun(const int&& x) { cout << "const 右值引用" << endl; }
//
//template<typename T>
//void PerfectForward(T&& t) 
//{ 
//	Fun(std::forward<T>(t)); 
//}
//
//int main()
//{
//	PerfectForward(10);  //右值
//	int a;
//	PerfectForward(a);//左值
//	PerfectForward(std::move(a));//右值
//	const int b = 8;
//	PerfectForward(b);//const左值
//	PerfectForward(std::move(b)); // const 右值
//	return 0;
//}

//int main()
//{
//	zyq::list<zyq::string> li;
//
//	zyq::string s1 = "abcd";
//	li.push_back(s1); //调用左值版本
//
//	li.push_back("1234");//调用右值版本
//
//}


//int main()
//{
//	//lambda实现两数相加
//	auto add = [](int a, int b) {return a + b; };
//	cout << add(1, 2) << endl;
//
//	//lambda实现swap
//	auto swap = [](int& a, int& b)
//	{
//		int temp = a;
//		a = b;
//		b = temp;
//	};
//}

//int main()
//{
//	/*int a = 1;
//	int b = 2;
//	int c = 3;
//	int d = 4;*/
//	////传值捕捉
//	//auto swap1 = [a,b]()mutable
//	//{
//	//	int temp = a;
//	//	a = b;
//	//	b = temp;
//	//};
//	//swap1();
//	//cout << a << " " << b << endl;   
//
//	//cout << endl;
//	////传引用捕捉
//	//auto swap2 = [&a, &b]()mutable
//	//{
//	//	int temp = a;
//	//	a = b;
//	//	b = temp;
//	//};
//	//swap2();
//	//cout << a << " " << b << endl;
//
//	//cout << endl;
//
//	int a = 1;
//	int b = 2;
//	int c = 3;
//	int d = 4;
//	auto func = [&, a, b]() mutable
//	{
//		a++;
//		b++;
//		c++;
//		d++;
//	};
//	func();
//	cout << a << " " << b <<" " << c << " " << d << " " << endl;
//}


//int main()
//{
//	auto func1 = [](int a,int b) {return a + b; };
//	cout << typeid(func1).name() << endl;
//	auto func2 = [](int a, int b) {return a + b; };
//	cout << typeid(func2).name() << endl;
//}


//class Rate
//{
//public:
//	Rate(double rate) : _rate(rate)
//	{}
//	double operator()(double money, int year)
//	{
//		return money * _rate * year;
//	}
//private:
//	double _rate;
//};
//int main()
//{
//	// 函数对象
//	double rate = 0.49;
//	Rate r1(rate);
//	r1(10000, 2);
//	// lamber
//	auto r2 = [=](double monty, int year)->double {return monty * rate * year;
//	};
//	r2(10000, 2);
//	return 0;
//}

//template<class T>
//void _Show_list(const T& val)
//{
//	cout << val<<endl;
//}
//
//template<class T,class ...Args>
//void _Show_list(T val,Args... args)
//{
//	cout << val << " ";
//	_Show_list(args...);
//}
//
//template<class ...Args>
//void Show_list(Args... args)
//{
//	_Show_list(args...);
//}


//void _Show_list(const double& val)
//{
//	cout << val << endl;
//}
//
//void _Show_list(const string& val, double c)
//{
//	cout << val << " ";
//	_Show_list(c);
//}
//
//void _Show_list(const int& val, string b,double c)
//{
//	cout << val << " ";
//	_Show_list(b,c);
//}
//
//void Show_list(int a,string b,double c)
//{
//	_Show_list(a,b,c);
//}
//
//template<class T>
//void print(const T& val)
//{
//	cout << val << " ";
//}
//
//template<class ...Args>
//void Show_list(Args... args)
//{
//	int arr[] = { (print(args),0)... };
//	cout << endl;
//}
//
//int main()
//{
//	Show_list(1,"abc",2.2);
//	return 0;
//}

//int main()
//{
//	list<pair<zyq::string,int>> lt1;
//
//	//pair<zyq::string, int> kv1("abc", 1);
//	//lt1.push_back(kv1);
//	//lt1.push_back(move(kv1));
//	//cout << endl;
//	pair<zyq::string, int> kv1("abc", 1);
//	lt1.push_back(kv1);
//	lt1.push_back(move(kv1));
//	cout << endl;
//
//	pair<zyq::string, int> kv2("abc", 1);
//	lt1.emplace_back(kv2);
//	lt1.emplace_back(move(kv2));
//}

int main()
{
	list<pair<zyq::string, int>> lt1;

	pair<zyq::string, int> kv1("abc", 1);
	lt1.push_back(move(kv1));
	cout << endl;

	lt1.emplace_back("abc", 1);
}